package br.com.toscano.gobra.domain;

import java.math.BigDecimal;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity 
@Table(name="ITEM_BOLETIM_Medido")
public class ItemBoletimMedicao {
		
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name="IBME_ID")
	private Long id;

	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "BOMEf_ID")
	private BoletimMedicao boletimMedicao;

	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "ITPL_ID")
	private ItemTabelaPrecoLicitacao itemTabelaPrecoLicitacao;

	@ManyToOne(fetch = FetchType.LAZY, optional = true)
	@JoinColumn(name = "ITPA_ID")
	private ItemTabelaPrecoLicitacaoAditivo itemTabelaPrecoLicitacaoAditivo;

	@Column(name = "IBME_QTD_PREVISTO", nullable = false, precision = 19, scale = 2)
	private BigDecimal quantidadePrevisto;

	@Column(name = "IBME_QTD_MEDIDO", nullable = false, precision = 19, scale = 2)
	private BigDecimal quantidadeMedido;

	@Column(name = "IBME_QTD_ACUMULADO", nullable = false, precision = 19, scale = 2)
	private BigDecimal quantidadeAcumulado;
	
	@Column(name = "IBME_VALOR_PREVISTO", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorPrevisto;

	@Column(name = "IBME_VALOR_MEDIDO", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorMedido;

	@Column(name = "IBME_VALOR_ACUMULADO", nullable = false, precision = 19, scale = 2)
	private BigDecimal valorAcumulado;
	
	@Column(name = "IBME_PERCENTUAL_PERIODO", nullable = false, precision = 19, scale = 2)
	private BigDecimal percentualPeriodo;
	
	public int hashCode() {
		StringBuffer sb = new StringBuffer();
		
		sb.append(this.getId());
		
		return sb.toString().hashCode();
	}
	
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ItemBoletimMedicao other = (ItemBoletimMedicao) obj;
		 if (id == null && other.id == null || id == 0 && other.id == 0) {
				return ((itemTabelaPrecoLicitacaoAditivo != null && other.itemTabelaPrecoLicitacaoAditivo != null &&itemTabelaPrecoLicitacaoAditivo.equals(other.itemTabelaPrecoLicitacaoAditivo)) ||
						(itemTabelaPrecoLicitacaoAditivo == null && other.itemTabelaPrecoLicitacaoAditivo == null))
				&& ((itemTabelaPrecoLicitacao != null && other.itemTabelaPrecoLicitacao != null && itemTabelaPrecoLicitacao.equals(other.itemTabelaPrecoLicitacao)) ||
						(itemTabelaPrecoLicitacao == null && other.itemTabelaPrecoLicitacao == null))
				&& quantidadeMedido.equals(other.quantidadeMedido)
				 && quantidadeAcumulado.equals(other.quantidadeAcumulado)
				 && valorMedido.equals(other.valorMedido)
				 && valorAcumulado.equals(other.valorAcumulado)
				 && percentualPeriodo.equals(other.percentualPeriodo)
				 ;
		}else if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id)) {
			return false;
		}
		return true;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public BoletimMedicao getBoletimMedicao() {
		return boletimMedicao;
	}

	public void setBoletimMedicao(BoletimMedicao boletimMedicao) {
		this.boletimMedicao = boletimMedicao;
	}

	public ItemTabelaPrecoLicitacao getItemTabelaPrecoLicitacao() {
		return itemTabelaPrecoLicitacao;
	}

	public void setItemTabelaPrecoLicitacao(
			ItemTabelaPrecoLicitacao itemTabelaPrecoLicitacao) {
		this.itemTabelaPrecoLicitacao = itemTabelaPrecoLicitacao;
	}

	public ItemTabelaPrecoLicitacaoAditivo getItemTabelaPrecoLicitacaoAditivo() {
		return itemTabelaPrecoLicitacaoAditivo;
	}

	public void setItemTabelaPrecoLicitacaoAditivo(
			ItemTabelaPrecoLicitacaoAditivo itemTabelaPrecoLicitacaoAditivo) {
		this.itemTabelaPrecoLicitacaoAditivo = itemTabelaPrecoLicitacaoAditivo;
	}

	public BigDecimal getQuantidadeMedido() {
		return quantidadeMedido;
	}

	public void setQuantidadeMedido(BigDecimal quantidadeMedido) {
		this.quantidadeMedido = quantidadeMedido;
	}

	public BigDecimal getQuantidadeAcumulado() {
		return quantidadeAcumulado;
	}

	public void setQuantidadeAcumulado(BigDecimal quantidadeAcumulado) {
		this.quantidadeAcumulado = quantidadeAcumulado;
	}

	public BigDecimal getValorMedido() {
		return valorMedido;
	}

	public void setValorMedido(BigDecimal valorMedido) {
		this.valorMedido = valorMedido;
	}

	public BigDecimal getValorAcumulado() {
		return valorAcumulado;
	}

	public void setValorAcumulado(BigDecimal valorAcumulado) {
		this.valorAcumulado = valorAcumulado;
	}

	public BigDecimal getPercentualPeriodo() {
		return percentualPeriodo;
	}

	public void setPercentualPeriodo(BigDecimal percentualPeriodo) {
		this.percentualPeriodo = percentualPeriodo;
	}
	
	public ItemTabelaPrecoObra getItemTabelaPrecoObra() {
		if (this.getItemTabelaPrecoLicitacao() != null) {
			return this.getItemTabelaPrecoLicitacao().getItemTabelaPrecoObra();
		} else if (this.getItemTabelaPrecoLicitacaoAditivo() != null) {
			return this.getItemTabelaPrecoLicitacaoAditivo().getItemTabelaPrecoLicitacao().getItemTabelaPrecoObra();
		} 
		return null;
	}

	public BigDecimal getQuantidadePrevisto() {
		return quantidadePrevisto;
	}

	public void setQuantidadePrevisto(BigDecimal quantidadePrevisto) {
		this.quantidadePrevisto = quantidadePrevisto;
	}

	public BigDecimal getValorPrevisto() {
		return valorPrevisto;
	}

	public void setValorPrevisto(BigDecimal valorPrevisto) {
		this.valorPrevisto = valorPrevisto;
	}
}